//
//  people.m
//  runtime
//
//  Created by dihuijun on 17/3/29.
//  Copyright © 2017年 Cycle. All rights reserved.
//

#import "people.h"
#import <objc/message.h>
@implementation people

///动态添加方法，首先实现这个resolveInstanceMethod
//resolveClassMethod调用：当调用了一个没有实现的方法，但是又调用了这个，就回调用resolveInstanceMethod
//resolveInstanceMethod作用：就知道哪些方法没有实现，就可以动态添加方法
// sel:没有实现得方法
+(BOOL)resolveInstanceMethod:(SEL)sel
{
    NSLog(@"%@",NSStringFromSelector(sel));
    
    
    //一
    if(sel == @selector(eat))
    {
        //给对象添加东西：objc_
        //给类添加东西：class_
        /*
         cls:给哪个类添加方法
         SEL:添加方法的方法编号是什么
         IMP：方法实现，函数入口，函数名
         types：方法类型
         
         class_addMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>, <#IMP imp#>, <#const char *types#>)
         */
        //v@:    指 v 返回值是void   类型是id就是@  ：就是SEL
        class_addMethod(self, sel, (IMP)eatGo, "v@:");
        
        
        return YES;
        
    }else if (sel == @selector(eat:)){
        class_addMethod(self, sel, (IMP)eatGoHaveParam, "v@:@");
        
        
        return YES;

    }
    
    return [super resolveInstanceMethod:sel];
}
////默认方法肯定有这两个参数
void eatGo(id self ,SEL _cmd){
    
    NSLog(@"调用了eat  %@  ---- %@",self,NSStringFromSelector(_cmd));
}
void eatGoHaveParam(id self ,SEL _cmd,id param){
    
    NSLog(@"调用了eat  %@  ---- %@ --- %@",self,NSStringFromSelector(_cmd),param);
}

//-(void)eat:(NSString *)food{
//    NSLog(@"chichichi");
//}
@end
